﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Zimmerreservierung.Controller;
using Zimmerreservierung.Model;

namespace Zimmerreservierung.Forms
{
    public partial class FormReservierungNeu : Form
    {
        const int START_HOUR = 14;
        const int END_HOUR = 10;

        protected Reservierung reservierung;
        protected bool editMode;
       // private TimeSpan anzahlTage;

        private KundenController kController;
        private ZimmerController zController;
        protected ReservierungsController rController;

        public FormReservierungNeu(Reservierung reservierung)
        {
            InitializeComponent();

            this.reservierung = reservierung;

            kController = KundenController.getInstance();
            zController = ZimmerController.getInstance();
            rController = ReservierungsController.getInstance();

            SetupForm();

            LoadKunden(-1);

            //coming from kundenformular
            if (reservierung.Kunde != null)
            {
                this.editMode = true;
                cbKunde.Enabled = false;
                cbKunde.SelectedValue = reservierung.Kunde.Id;
                btnNeuerKunde.Hide();
            }
        }

        private void SetupForm()
        {
            this.btnSave.DialogResult = DialogResult.OK;
            this.btCancel.DialogResult = DialogResult.Cancel;
            this.txtRabatt.Text = "0";

            this.cbKunde.DropDownStyle = ComboBoxStyle.DropDownList;
            this.cbZimmer.DropDownStyle = ComboBoxStyle.DropDownList;
            this.cbKosten.DropDownStyle = ComboBoxStyle.DropDownList;

            foreach (Control c in page2.Controls)
                c.Hide();

            foreach (Control c in page3.Controls)
                c.Hide();
        }

        private void btnPage2_Click(object sender, EventArgs e)
        {
            reservierung.Kunde = (Kunde)cbKunde.SelectedItem;

            DateTime pickedStartDate = dtpVon.Value;
            DateTime pickedEndDate = dtpBis.Value;
            reservierung.Startdatum = new DateTime(pickedStartDate.Year, pickedStartDate.Month, pickedStartDate.Day, START_HOUR, 0, 0);
            reservierung.Enddatum = new DateTime(pickedEndDate.Year, pickedEndDate.Month, pickedEndDate.Day, END_HOUR, 0, 0);

            if (handleVonBis(reservierung.Startdatum, reservierung.Enddatum))
            {
                List<Zimmer> freieZimmer = rController.GetFreieZimmer(reservierung.Startdatum.ToString("yyyy-MM-dd HH:mm:ss.fff"), reservierung.Enddatum.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                if (freieZimmer.Count > 0)
                {
                    var bindinglist = new BindingList<Zimmer>(freieZimmer);
                    var source = new BindingSource(bindinglist, null);
                    cbZimmer.DataSource = source;
                    cbZimmer.DisplayMember = "NameAndBelegzahl";
                    cbZimmer.ValueMember = "id";

                    LoadZimmerPreise((Zimmer)cbZimmer.SelectedItem);

                    foreach (Control c in page1.Controls)
                        c.Enabled = false;

                    foreach (Control c in page2.Controls)
                        c.Show();
                }
                else
                {
                    MessageBox.Show("Es sind keine Zimmer in diesem Zeitraum frei!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    DialogResult = System.Windows.Forms.DialogResult.None;
                    return;
                }
            }
        }

        private void btnPage1_Click(object sender, EventArgs e)
        {
            foreach (Control c in page2.Controls)
                c.Hide();

            foreach (Control c in page1.Controls)
                c.Enabled = true;

            if (editMode)
            {
                cbKunde.Enabled = false;
            }
        }

        private void btnBackToPage2_Click(object sender, EventArgs e)
        {
            foreach (Control c in page3.Controls)
                c.Hide();

            foreach (Control c in page2.Controls)
                c.Enabled = true;
        }

        private void btnPage3_Click(object sender, EventArgs e)
        {
            int rabatt = handleRabatt(txtRabatt.Text);

            if (rabatt < 0){
                MessageBox.Show("Der Rabatt kann nicht negativ sein!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (rabatt >= 0)
            {
                reservierung.Rabatt = rabatt;
                reservierung.Zimmer = (Zimmer)cbZimmer.SelectedItem;
                reservierung.Zimmerpreis = rController.CalculateKosten(reservierung.Startdatum, reservierung.Enddatum, rabatt, 
                    Convert.ToDouble(cbKosten.SelectedValue), reservierung.Kunde.Rabat);

                lblKosten.Text = reservierung.Zimmerpreis.ToString() + " €";

                foreach (Control c in page2.Controls)
                    c.Enabled = false;

                foreach (Control c in page3.Controls)
                    c.Show();
            }
        }

        private void btnNeuerKunde_Click(object sender, EventArgs e)
        {
            FormKundeNeu form = new FormKundeNeu();
            form.ShowDialog();
            if (form.DialogResult != System.Windows.Forms.DialogResult.Cancel)
            {
                // refresh combobox#
                LoadKunden(GetLastInsertedKundenId());
            }
        }

        public int GetLastInsertedKundenId()
        {
            int lastInsertedId = -1;

            try
            {
                lastInsertedId = kController.GetLastInsertedKundenId();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return lastInsertedId;
        }

        private void btCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            string startDatum = reservierung.Startdatum.ToString("yyyy-MM-dd HH:mm:ss.fff");
            string endDatum = reservierung.Enddatum.ToString("yyyy-MM-dd HH:mm:ss.fff");

            string rabatt = Convert.ToString(reservierung.Rabatt / 100.0).Replace(',', '.');
            string zimmerpreis = Convert.ToString(reservierung.Zimmerpreis);

            StoreReservierung(reservierung.Kunde.Id, reservierung.Zimmer.Id, rabatt, zimmerpreis, ((Kosten)cbKosten.SelectedItem).Bezeichnung, startDatum, endDatum);

            this.Close();
        }

        internal virtual void StoreReservierung(int kundeId, int zimmerId, string rabatt, string zimmerpreis, string ZimmerPreisArt, string startDatum, string endDatum)
        {
            try
            {
                rController.StoreReservierung(kundeId, zimmerId, rabatt, zimmerpreis, ZimmerPreisArt, startDatum, endDatum);
                MessageBox.Show("Reservierung erfolgreich gespeichert.");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private int handleRabatt(string txtRabattValue)
        {
            string rab = txtRabattValue;
            int rabatt = 0;

            if (string.IsNullOrEmpty(rab))
                return rabatt;
            else
            {
                if (Int32.TryParse(rab, out rabatt))
                {
                    return rabatt;
                }
                else
                {
                    MessageBox.Show("Rabatt muss eine Zahl sein!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    DialogResult = System.Windows.Forms.DialogResult.None;
                    rabatt = -1;
                }
            }

            return rabatt;
        }

        private bool handleVonBis(DateTime von, DateTime bis)
        {
            if (DateTime.Compare(von, bis) >= 0)
            {
                MessageBox.Show("Startdatum muss vor Enddatum liegen!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

//            TimeSpan anzahlTage = bis - von;
//            if (anzahlTage.Days == 0)
//            {
//                MessageBox.Show("Eine Reservierung muss mindestens einen Tag dauern!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
//                return false;
//            }

            return true;
        }

        private void LoadKunden(int kundeId) 
        {
            List<Kunde> kunden = new List<Kunde>();

            try
            {
                kunden = kController.GetKunden();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            var bindinglist = new BindingList<Kunde>(kunden);
            var source = new BindingSource(bindinglist, null);
            cbKunde.DataSource = source;
            cbKunde.DisplayMember = "name";
            cbKunde.ValueMember = "id";

            if (kundeId != -1)
                cbKunde.SelectedValue = kundeId;
        }

        private void LoadZimmerPreise(Zimmer zimmer)
        {
            cbKosten.DataSource = zController.GetZimmerKosten(zimmer.Id);
            cbKosten.DisplayMember = "Bezeichnung";
            cbKosten.ValueMember = "Betrag";
        }

        private void cbZimmer_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadZimmerPreise((Zimmer)cbZimmer.SelectedItem);
        }

        private void dtpBis_ValueChanged(object sender, EventArgs e)
        {

        }
    }
}
